<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    /* 
    构造函数: 上有显式原型属性
    显式原型: 函数上的prototype属性, 它指向的就是原型对象
    原型对象: 执行函数定义/创建函数对象时, 自动创建, 并将其赋值给函数的prototype属性, 给原型对象添加constructor属性, 指向构造函数
    实例对象: new函数产生的, 给实例对象添加一个__proto__属性, 值为构造函数的prototype属性值
    隐式原型: 对象上的__proto__属性, 它也指向的原型对象
    */
    function Fn() { // this.prototype = {} => this.prototype.constructor = this
      
    }

    // 创建函数对象  => 赋值给Fn

    console.log(Fn.prototype)

    // 相互引用   // 循环引用
    // Fn.prototype = {}
    // Fn.prototype.constructor = Fn

    const fn = new Fn()  // const obj = {} => obj.__proto__=Fn.prototype =>  Fn.call(obj) => 返回obj
    // this.__proto__ = Fn.prototype

    console.log(Object instanceof Object)
    console.log(Object instanceof Function)
    console.log(Function instanceof Object)
    console.log(Function instanceof Function)
    console.log(Fn instanceof Object)
    console.log(Fn instanceof Function)
    console.log(fn instanceof Object)
    console.log(fn instanceof Function) // false

    /* 
    所有函数都是Function的实例  => 任意函数 instanceof Function 是true
    函数/函数的实例都是对象 => 任意函数/函数的实例 instanceof Object  是true
    函数的实例 不是函数 函数的实例 instanceof Function 是 false
    */

    /* 
    A instanceof B
      B的prototype指向的原型对象是A原型链上的某个原型对象
    */
   console.log(Function.prototype.__proto__===Object.prototype) // true
   console.log(Function.prototype)
   /* 
   内部给Function的原型对象添加__proto__属性, 值为Object的prototype属性
   Function.prototype.__proto__ = Object.prototype 
   */

   /* 
   function Object (){}  JS引擎先执行内置的程序, 定义一些内置函数和对象: Function / Object / Date / String / Math
   */
   new Object()
   function fn22(params) {
    
   }
  </script>
</body>
</html>